package io.github.ali.commons.lock.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.StringUtils;

import io.github.ali.commons.lock.LockerFactory;

/**
 * 执行业务需要锁
 * @author bailey
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequireLock {
	String value() default StringUtils.EMPTY;
	/**
	 * 选择锁实现
	 * @return
	 */
	String lockerName() default LockerFactory.DEFAULT_LOCKER_NAME;
	/**
	 * 前缀
	 * 
	 * @return
	 */
	String prefix() default StringUtils.EMPTY;

	/**
	 * 生成锁的key;可为字符串,或SpEL表达式,也可为空(此时key将默认为注解所在类全名+方法名)
	 * 
	 * @return
	 */
	String key() default StringUtils.EMPTY;
	
	/**
	 * 后缀
	 * 
	 * @return
	 */
	String suffix() default StringUtils.EMPTY;

	/**
	 * 持有时间(最小单位:秒);默认0,需手动释放(由具体实现决定)
	 * 
	 * @return
	 */
	int expiring() default 0;

	/**
	 * 持有时间单位;默认:秒
	 * 
	 * @return
	 */
	TimeUnit timeUnit() default TimeUnit.SECONDS;

	/**
	 * 尝试次数<br/>
	 * 小于0：持续尝试,直到获取锁
	 * 
	 * @return
	 */
	int tryTimes() default 0;
	/**
	 * 尝试间隔;单位:ms
	 * @return
	 */
	long tryGap()default 0l;
}
